#include<stdio.h>
#include<queue>
using namespace std;
const int maxn=100;
char maps[maxn][maxn];
bool inq[maxn][maxn]={false};
int m,n;
int s[2][4]={
  1,-1,0,0,
  0,0,1,-1,
}; 

 struct node{
	int x,y;
	int step;
 } S,T,Node;

bool test(int x,int y)
{
	if(x>=n||y>=m||x<0||y<0) 
		return false;
	if(maps[x][y]=='*')  
		return false;
	if(inq[x][y]==true)  
		return false;
	return true;
} 

int bfs()
{
	queue<node> q;
	q.push(S);
	while(!q.empty()){
		node top=q.front();
		q.pop();
		if(top.x==T.x&&top.y==T.y){
			return top.step;
		}
		for(int i=0;i<4;i++){
			int nx=top.x+s[0][i];
			int ny=top.y+s[1][i];
			if(test(nx,ny)){
				Node.x=nx,Node.y=ny;
				Node.step=top.step+1;
				q.push(Node);
				inq[nx][ny]=true;
			}
		}
	}
	return -1;
}

int main()
{
	scanf("%d%d",&n,&m);
	for(int i=0;i<n;i++){
		getchar();
		for(int j=0;j<m;j++){
			maps[i][j]=getchar();
		}
		maps[i][m+1]='\0';
	}
	scanf("%d%d%d%d",&S.x,&S.y,&T.x,&T.y);
	S.step=0;
	printf("%d",bfs()); 
	return 0;
} 
